#ifndef SYMBOLE_H_
#define SYMBOLE_H_

#include <iostream>
#include <vector>
#include <string>
using namespace std;

#define FICHIER_MOTS_CLE "motsCles.txt"

/*! \file Symbole.h
        \brief La spécification de la classe Symbole
        Décrit la liste des méthodes et attributs associés à la classe Symbole
        \author Ribes Gaël, Pauli Marie
        \date 04.01.2012
 */

/*! \class Symbole
        \brief La classe représentant les Symboles.
Cette classe permet de représenter sous la forme d'un objet
une variable de type Symbole. Les méthodes suivantes sont associées
à un objet de type Symbole :
        \li getChaine
 */


class Symbole {
public:
	enum categorieSymbole { MOTCLE, VARIABLE, ENTIER, REEL, CHAINE, CARACTERE, INDEFINI, FINDEFICHIER };
        
            /*! \fn Symbole(string s=string(""))
            \brief Constructeur de la classe Symbole.
    Ce constructeur construit un symbole à partir d'une chaîne s
            \param s - la chaîne qui va former le symbole.
     */
	Symbole(string s = string("")); // construit le symbole à partir de la chaine (string) ch lue par le lecteur de symbole dans un fichier
	bool operator == (string ch) ; // pour tester l'égalité entre le symbole et une chaîne
	inline bool operator != (string ch) { return ! (*this == ch); } // pour tester la différence...
        
            /*! \fn string getChaine() 
\brief Retourne la chaîne constituant le symbole.
\return la "valeur" du Symbole.
     */
	inline string getChaine()           { return this->chaine;}     // accesseur

	friend ostream & operator <<(ostream & cout, Symbole symb);     // fonction amie pour pouvoir afficher un symbole sur cout 

private:
        /*! \var string           chaine
\brief Contient la chaîne formant le symbole
     */
	string           chaine;              // chaine du symbole
        
                /*! \var categorieSymbole categorie
\brief Contient la catégorie du symbole
     */
	categorieSymbole categorie;           // categorie du symbole (voir type énuméré ci-dessus)
        
             /*! \fn static bool      isMotCle(string s)
\brief Retourne vrai si le symbole est un motclé
\return retourne si le symbole est un mot clé ou pas.
     */      
	static bool      isMotCle(string s);  // méthode de classe : renvoie vrai si s est un mot clé du langage
};

#endif /* SYMBOLE_H_ */
